import COS from 'cos-wx-sdk-v5' // 通过npm安装的sdk

export default class COSUploadFile {
    static BUCKET = 'soul-1255598558'
    static REGION = 'ap-beijing'

    constructor(file) {
        // 初始化
        this.file = file
        this.cos = this.init()
    }

    /**
     * 初始化COS对象，更具临时密钥生成签名
     * @returns {Object} cos 签名对象
     */
    init() {
        return new COS({
            // 腾讯灯塔只对 COS 侧的请求性能进行监控，不会上报业务侧数据。
            EnableTracker: true, // 腾讯灯塔： 为了持续跟踪和优化 SDK 的质量
            // getAuthorization 必选参数
            getAuthorization: async function (options, callback) {
                // 初始化时不会调用，只有调用cos方法（比如cos.putObject）时才会进入
                // 异步获取临时密钥
                // 服务端 JS 和 PHP 例子：https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/
                // 服务端其他语言参考 COS STS SDK ：https://github.com/tencentyun/qcloud-cos-sts-sdk
                // STS 详细文档指引看：https://cloud.tencent.com/document/product/436/14048

                // const res = await http.get('/v1/uploadSts') // url替换成您自己的后端服务
                uni.request({
                    url: 'https://appapi.ivmcr.com/ivmcr/upload',
                    method: 'GET',
                    success: async (res) => {
						const {data, status} = res.data;
						
                        if (status === 0) {
                            try {
                                var credentials = data.credentials
                            } catch (e) {}
                            if (!data || !credentials) {
                                return console.error('credentials invalid:\n' + JSON.stringify(data, null, 2))
                            }
                            callback({
                                TmpSecretId: credentials.tmpSecretId,
                                TmpSecretKey: credentials.tmpSecretKey,
                                SecurityToken: credentials.sessionToken,
                                // 建议返回服务器时间作为签名的开始时间，避免用户浏览器本地时间偏差过大导致签名错误
                                StartTime: data.startTime, // 时间戳，单位秒，如：1580000000
                                ExpiredTime: data.expiredTime, // 时间戳，单位秒，如：1580000000
                            })
                        }
                    },
                })
            },
        })
    }

    /**
     * 上传方法
     * @returns {Object} 返回一个Promise对象
     */
    uploadFile() {
		uni.showLoading({
			title:"文件开始上传",
			mask:true
		})
		
        return new Promise((resolve, reject) => {
            this.cos.postObject(
                {
                    Bucket: COSUploadFile.BUCKET /* 填入您自己的存储桶，必须字段 */,
                    Region: COSUploadFile.REGION /* 存储桶所在地域，例如ap-beijing，必须字段 */,
                    Key: `ph/${
                        this.file.path.split('/')[this.file.path.split('/').length - 1]
                    }` /* 存储在桶里的对象键（例如1.jpg，a/b/test.txt），必须字段 */,
                    FilePath:
                        this.file
                            .path /* 必须，上传文件对象，可以是input[type="file"]标签选择本地文件后得到的file对象 */,
                    SliceSize: 1024 * 1024 * 5 /* 触发分块上传的阈值，超过5MB使用分块上传，非必须 */,
					onProgress: function(info) {
						var percent = parseInt(info.percent * 10000) / 100;
						// var speed = parseInt((info.speed / 1024 / 1024) * 100) / 100;
						// console.log('进度：' + percent + '%; 速度：' + speed + 'Mb/s;');
						that.updateLoadingTitle('上传进度：' + percent + '%')
					},
                },
                function (err, data) {
					uni.hideLoading();
					
                    if (err) return reject(err)
                    if (!data.Location.includes('http')) {
                        data.url = 'https://' + data.Location
                    }
					
					data.url = "https://file.ivmcr.com" + data.url.replace(/^https:\/\/[^/]+/, "");
                    resolve(data)
                }
            )
        })
    }

	// 模拟动态更新标题函数
	updateLoadingTitle(newTitle) {
	    uni.hideLoading(); // 隐藏当前的加载提示
	    uni.showLoading({ // 重新显示加载提示
	        title: newTitle,
	        mask: true
	    });
	}
	
    /**
     * 生成hash
     */
    generateHashWithTimeAndRandom(name) {
        const timestamp = Date.now().toString() // 获取当前时间戳并转换为字符串
        const randomNumber = this.getRandomNumber(1, 100) // 生成1~100的随机整数
        const input = (timestamp + randomNumber + name).toString(16) // 组合时间戳和随机数

        // 将组合后的数据转换为16进制表示
        let hashHex = ''
        for (let i = 0; i < input.length; i++) {
            const hex = input.charCodeAt(i).toString(16)
            hashHex += hex
        }
        return hashHex
    }

    getRandomNumber(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min
    }
}
